<?php


/**
 * Pw_task_group的dao.
 *
 * @author Shi Long <long.shi@alibaba-inc.com>
 * @copyright ©2003-2103 phpwind.com
 * @license http://www.windframework.com
 *
 * @version $Id: PwTaskGroupDao.php 9238 2012-05-04 03:12:52Z long.shi $
 */
class PwTaskGroupDao extends PwBaseDao
{
    protected $_table = 'task_group';
    protected $_dataStruct = array('taskid', 'gid', 'is_auto', 'end_time');

    /**
     * 批量添加任务用户组信息.
     *
     * @param array $data
     *
     * @return bool
     */
    public function batchReplaceTaskGroups($data)
    {
        if (empty($data) || !is_array($data)) {
            return false;
        }
        $tmp = array();
        foreach ($data as $v) {
            $v = $this->_filterStruct($v);
            if ($v) {
                $tmp[] = $v;
            }
        }
        if (empty($tmp)) {
            return false;
        }
        $sql = $this->_bindSql('REPLACE INTO %s (`taskid`, `gid`, `is_auto`, `end_time`) VALUES %s',
            $this->getTable(), $this->sqlMulti($tmp));

        return $this->getConnection()->execute($sql);
    }

    /**
     * 根据任务id删除.
     *
     * @param int $id
     *
     * @return bool
     */
    public function deleteByTaskId($id)
    {
        $sql = $this->_bindTable('DELETE FROM %s WHERE `taskid` = ?');

        return $this->getConnection()->createStatement($sql)->update(array($id));
    }

    /**
     * 获取id不在此范围内的可申请任务列表.
     *
     * @param array $noIds
     * @param int   $num
     * @param int   $start
     * @param int   $endTime
     *
     * @return array
     */
    public function getApplicableTasks($noIds, $gids, $num, $start, $endTime)
    {
        $where = '1';
        if ($noIds) {
            $where .= $this->_bindSql(' AND `taskid` NOT IN %s',
            $this->sqlImplode((array) $noIds));
        }
        $sql = $this->_bindSql(
            'SELECT distinct `taskid` FROM %s WHERE %s AND `gid` IN %s AND `end_time` > %s AND `is_auto` = 0 ORDER BY `taskid` DESC %s',
            $this->getTable(), $where, $this->sqlImplode((array) $gids), $endTime,
            $this->sqlLimit($num, $start));

        return $this->getConnection()->query($sql)->fetchAll('taskid');
    }

    /**
     * 查询id不在此范围内的可申请任务数量.
     *
     * @param array $noIds
     * @param array $gids
     * @param int   $endTime
     *
     * @return int
     */
    public function countApplicableTasks($noIds, $gids, $endTime)
    {
        $where = '1';
        if ($noIds) {
            $where .= $this->_bindSql(' AND `taskid` NOT IN %s',
            $this->sqlImplode((array) $noIds));
        }
        $sql = $this->_bindSql(
            'SELECT COUNT(distinct `taskid`) FROM %s WHERE %s AND `gid` IN %s AND `end_time` > %s AND `is_auto` = 0',
            $this->getTable(), $where, $this->sqlImplode((array) $gids), $endTime);

        return $this->getConnection()->query($sql)->fetchColumn();
    }

    /**
     * 获取通过自动申请过滤的任务
     *
     * @param int   $last_id
     * @param array $gids
     * @param int   $limit
     * @param int   $endTime
     *
     * @return int
     */
    public function getAutoApplicableTask($last_id, $gids, $limit, $endTime)
    {
        $sql = $this->_bindSql(
            'SELECT `taskid` FROM %s WHERE `taskid` > ? AND `gid` IN %s AND `is_auto` = 1 AND `end_time` > %s ORDER BY `taskid` %s',
            $this->getTable(), $this->sqlImplode((array) $gids), $endTime, $this->sqlLimit($limit));

        return $this->getConnection()->createStatement($sql)->queryAll(array($last_id), 'taskid');
    }
}
